import pandas as pd

pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 100)
pd.set_option('display.width', 1000)
pd.set_option('display.unicode.east_asian.width', True)

"""
1、求和
    sum([axis=0, skipna]):
        axis: 1表示按行相加，0表示按列相加
        skipna: 1表示将NaN转成0
"""
# 求和
data = [[100, 90, 80], [98, 67, 56], [56, 56]]
columns = ['数学', '语文', '英语']
df = pd.DataFrame(data=data, columns=columns, index=[1, 2, 3])
print(df)

df['总分'] = df.sum(axis=1)  # 按行相加
print(df)

"""
2、求平均值 -- NaN看做是0
    mean([axis=0, skipna])
"""
df = df._append(df.mean(), ignore_index=True)  # 默认按照列计算平均
print(df)

"""
3、最大值
    max([axis=0, skipna])
"""
df = df._append(df.max(), ignore_index=True)  # 默认列比较
print(df)

"""
4、最小值
    min([axis=0, skipna])
"""
df = df._append(df.min(), ignore_index=True)  # 默认列比较
print(df)

"""
5、中位数
    median([axis=0, skipna])
"""
df = df._append(df.median(), ignore_index=True)  # 默认列比较
print(df)

"""
6、众数
    mode([axis=0, skipna])
"""
data = [[100, 98, 100], [100, 76, 76], [76, 98, 76]]
columns = ['数学', '语文', '英语']
df = pd.DataFrame(data=data, columns=columns, index=[1, 2, 3])
print(df)
print(df.mode())  # 默认按照列
print(df.mode(axis=1))  # 按照行

print(df['数学'].mode())  # 数学的众数

"""
7、方差
    var([axis=0, skipna])
"""
data = [[135, 140, 138, 145, 140], [140, 145, 139, 142, 132]]
index = ['李凡', '郭曙光']
columns = ['一模', '二模', '三模', '四模', '五模']
df = pd.DataFrame(data=data, columns=columns, index=index)
print(df)

print(df.var(axis=1))  # 无偏样本方差 = 方差和 / 样本数

"""
8、标准差
    std([axis=0, skipna])
"""
print(df.std(axis=1))

"""
9、分位数
    quantile(q=0.5, axis=0, numeric_only=True):
        numeric_only: 如果其为False，将计算时间日期的分位数
"""
data = [120, 110, 112, 100, 98, 34, 123, 115]
columns = ['数学']
df = pd.DataFrame(data=data, columns=columns)
print(df)

# 计算35%
x = df['数学'].quantile(0.35)
print(x)  # 104.5以上的，排名前35%

# 计算时间的分位数
df = pd.DataFrame({
    'A': [1, 2],
    'B': [pd.Timestamp('2020'), pd.Timestamp('2021')],
    'C': [pd.Timedelta('1 days'), pd.Timedelta('2 days')]
})
print(df)
print(df.quantile(0.5, numeric_only=False))
